package utils;

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @Author quan
 * @Description 单例模式的数据库连接类，目的是为了获取一个数据库连接
 * @Date 2023/6/28 17:43
 */
public class DBUtil {
    //1、先声明一个数据源对象
    private static DataSource dataSource = null;//注意这个DataSource是javax.sql下的，不要选错啦
    //定义数据库连接的参数
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/servlet?characterEncoding=utf8";
    private static final String USER = "root";
    private static final String PASSWORD = "123456";
    //在静态方法中初始化数据源:static在类加载的时候只执行一次，生命周期只有一次
    static {
        //使用的是哪个数据库，就设置哪个数据源
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setURL(URL);
        mysqlDataSource.setUser(USER);
        mysqlDataSource.setPassword(PASSWORD);
        //将自己设置的数据库的数据源 赋值给 原始声明的数据源
        dataSource = mysqlDataSource;
    }
    //私有化构造方法，让外面不能new
    private DBUtil(){}

    /**
     * 获取数据库连接
     * @return
     * @throws SQLException
     */
    //2、获取数据源连接
    public static Connection getConnection() throws SQLException {
         //通过数据源对象，获取数据库连接对象
        return dataSource.getConnection();
    }

    /**
     * 关闭并释放资源方法
     * @param resultSet
     * @param statement
     * @param connection
     */
    public static void close(ResultSet resultSet, PreparedStatement statement,Connection connection){
        //3、依次关闭并释放资源
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
